package  
{
	import flash.display.Sprite;
	import events.FrameEvent;
	import flash.display.Stage;
	import flash.events.Event;
	
	import flash.utils.describeType;
	
	/**
	 * ...
	 * @author me
	 */
	public class BaseFrame extends Sprite 
	{
		private var fhCloseListener:Function = null;
		private var fhOpenListener:Function = null;
		private var fhLoadedListener:Function = null;
		
		public var parentFrame:BaseFrame = null;
		public var mainFrame:Main = null;
		public var stageRef:Stage = null;
		
		public function BaseFrame(parentFrame:BaseFrame=null) 
		{
			/* Если фрейм главный */
			if (stage)
			{
				stageRef = stage;
				mainFrame = this as Main;
			}
			/* Если дочерний */
			else 
			{
				this.parentFrame = parentFrame;
				if (parentFrame!=null)
				{
					stageRef = parentFrame.stageRef;
					mainFrame = parentFrame.mainFrame;
				}	
				
			}
			
		}
		
		protected function update(e:Event):void
		{
			
		}
		
		public function Trace(msg:Object):void
		{
			trace(this+">>> "+msg);
		}
		
		/* Метод инициализации содержимого фрейма. Должен переопределяться */
		public function InitFrame():void 
		{
			/* Инициализация общего интерфейса */
			addEventListener(Event.ENTER_FRAME, update);
			/* Обработчик добавления в коллекцию отображений Main */
			//addEventListener(Event.ADDED_TO_STAGE, addedToMainListener);
			/* Обработчик добавления из коллекции отображений Main */
			addEventListener(Event.REMOVED, removedFromMainListener);
		};
		
		protected function addedToMainListener():void
		{
			trace("Фрейм добавлен на сцену");
			InitFrame();
		}
		
		protected function removedFromMainListener():void
		{}
		
		/* Переопределим, чтобы иметь указатели на функции-обработчики событий */
		override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
		{
			super.addEventListener(type, listener, useCapture, priority, useWeakReference);
			/* Сохраняем указатели на обработчики событий */
			switch(type)
			{
				case FrameEvent.FRAME_CLOSE:
				fhCloseListener = listener;
				break;
				case FrameEvent.FRAME_OPEN:
				fhOpenListener = listener
				break;
				case FrameEvent.FRAME_LOADED:
				fhLoadedListener = listener;
				break;
			}
		}
		
		/* Метод очистки содержимого фрейма. Удаление обработчиков */
		public function ClearFrame():void 
		{
			removeEventListener(Event.ENTER_FRAME, update);
			removeEventListener(Event.ADDED_TO_STAGE, addedToMainListener);
			removeEventListener(Event.REMOVED, removedFromMainListener);
			mainFrame = null;
			parentFrame = null;
		};
		
		/* Очистка от обработчиков событий фрейма. Вызывать при удалении фрейма из отображаемого 
		 * контейнера Main */
		public function ClearFrameListeners():void
		{
			if (fhCloseListener!=null)
				removeEventListener(FrameEvent.FRAME_CLOSE, fhCloseListener);
			if (fhLoadedListener!=null)
				removeEventListener(FrameEvent.FRAME_LOADED, fhLoadedListener);
			if (fhOpenListener!=null)
				removeEventListener(FrameEvent.FRAME_OPEN, fhOpenListener);
		}
		
		/* Процедура открытия фрейма */
		public function OpenFrame():void
		{
			InitFrame();
			dispatchEvent(new FrameEvent(FrameEvent.FRAME_OPEN));
		}
		
		/* Инициализация объекта события "Закрытие фрейма". param - параметр закрытия. */
		public function InitCloseEvent():void
		{
			//ClearFrame();
			var retEvent:FrameEvent = new FrameEvent(FrameEvent.FRAME_CLOSE);
			//retEvent.param = param;
			dispatchEvent(retEvent);
			retEvent = null;
		}
		
	}

}